package py.com.sole.dao.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;

import org.apache.log4j.Logger;

import py.com.sole.dao.DaoFactory;
import py.com.sole.dao.PadreDao;
import py.com.sole.dto.PadrePersonaDTO;
import py.com.sole.model.Padre;
import py.com.sole.model.TipoDocumento;

public class PadreImpl implements PadreDao {

  EntityManager em = DaoFactory.getEm();
  private static final Logger logger = Logger.getLogger(PadreDao.class);

  @Override
  public Padre addPadre(Padre padre) {
    try {
      EntityTransaction etx = em.getTransaction();
      etx.begin();
      em.persist(padre);
      etx.commit();
      em.refresh(padre);
      return padre;
    } catch (Exception e) {
      logger.error("No se pudo insertar el padre " + e);
      return null;
    }

  }

  @Override
  public void deletePadre(int id) {
    try {
      em.getTransaction().begin();
      em.remove(this.getPadreById(id));
      em.getTransaction().commit();
    } catch (Exception e) {

    }

  }

  @Override
  public void updatePadre(Padre padre) {
    // TODO Auto-generated method stub
    try {
      em.getTransaction().begin();
      em.merge(this.getPadreById(padre.getId()));
      em.getTransaction().commit();
    } catch (Exception e) {
      // TODO: handle exception
    }

  }

  @Override
  public Padre getPadreByName(String value) {
    try {
      Query q = em.createNamedQuery("Padre.findByDescripcion");
      q.setParameter("descripcion", value);
      return (Padre) q.getSingleResult();
    } catch (Exception e) {
      logger.error("Error al obtener el padre [getPadreByName] :" + e);
      return null;
    }

  }

  @SuppressWarnings("unchecked")
  @Override
  public List<Padre> getPadreByFilter(TipoDocumento tipoDocu, String nombre, String apellido, String nroDocu) {

    List<Padre> padres = new ArrayList<Padre>();
    List<Object[]> listObject = new ArrayList<Object[]>();

    if (nombre.equalsIgnoreCase("") && apellido.equalsIgnoreCase("") && nroDocu.equalsIgnoreCase("")) {
      return null;
    }

    String q = "SELECT \n"
      + "    pa.id,"
      + "    p.nombre, \n"
      + "    p.apellido, \n"
      + "    p.telefono,\n"
      + "    p.email,\n"
      + "    d.descripcion,\n"
      + "    p.documento,\n"
      + "    t.descripcion\n"
      + "FROM \n"
      + "    Padre pa left join pa.persona p\n"
      + "    left join p.direccion d,\n"
      + "    p.tipoDocumentoId t\n"
      + "WHERE \n"
      + "    and t = :tipoDocumento\n";

    if (!nombre.equals("")) {
      q = q + "    and p.nombre = :nombre\n";
    }

    if (!apellido.equals("")) {
      q = q + "    and p.apellido = :apellido\n";
    }
    q = q + "    and p.documento = :documento";
    try {
      Query query = em.createQuery(q);

      query.setParameter("tipoDocumento", tipoDocu);

      if (!nombre.equalsIgnoreCase("")) {
        query.setParameter("nombre", nombre);
      }

      if (!apellido.equalsIgnoreCase("")) {
        query.setParameter("apellido", apellido);
      }

      listObject = query.getResultList();
      for (Object[] objects : listObject) {
        Padre padre = this.getPadreById(Integer.parseInt(objects[0].toString()));
        padres.add(padre);
      }

    } catch (Exception e) {
      logger.error("No se pudo obtener la lista de padres [getPadreByFilter]: " + e);
      return null;
    }

    return padres;
  }

  @Override
  public Padre getPadreById(int id) {
    // TODO Auto-generated method stub
    return (Padre) em.createQuery(
      "SELECT p FROM Padre p where p.id = " + id).getSingleResult();

  }

  @SuppressWarnings(value = "all")
  public List<Padre> getPadres() {
    // TODO Auto-generated method stub
    return em.createQuery("SELECT p FROM Padre p WHERE p.activo=TRUE").getResultList();

  }

  /*@Override
   public List<Padre> getPadreByFilter(String tipoDocumento, String nombre,
   String apellido, String nroDocu) {
   // TODO Auto-generated method stub
   return null;
   }*/
  @SuppressWarnings(value = "all")
  public List<PadrePersonaDTO> getPadrePersona() {
    List<PadrePersonaDTO> listPadre = new ArrayList<PadrePersonaDTO>();

    try {
      List<Object[]> listObject = em.createNamedQuery("Padre.findPadrePersona").getResultList();
      for (Object[] objects : listObject) {
        PadrePersonaDTO padre = new PadrePersonaDTO();
        padre.setId(Integer.parseInt(objects[0].toString()));
        padre.setNombre((objects[1] != null) ? objects[1].toString() : "");
        padre.setApellido((objects[2] != null) ? objects[2].toString() : "");
        padre.setDocumento((objects[3] != null) ? objects[3].toString() : "");
        padre.setTelefono((objects[4] != null) ? objects[4].toString() : "");
        padre.setEmail((objects[5] != null) ? objects[5].toString() : "");
        listPadre.add(padre);

      }
    } catch (Exception e) {
      System.out.println("ocurrió un error al intentar obtener padres [getPadrePersona]" + e.getMessage());

    }

    return listPadre;

  }

}
